package cn.ljy.mes.model;


import cn.ljy.common.model.BaseModel;
import cn.ljy.common.model.validate.AddWorkValidation;
import cn.ljy.common.model.validate.UpdateWorkValidation;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

@ApiModel(value="物料批次")
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false,of = {"id"})
public class WmsMaterialBatch extends BaseModel {
  @NotBlank(groups = UpdateWorkValidation.class,message="id不能为空")
  private String id;
  @NotNull(groups = AddWorkValidation.class,message="物料不能为空")
  private MesMaterial material;//物料
  private String materialId;//物料ID，仅用于数据库检索（虽然有关联字段material，但是关联字段需要连表查询，故针对检索频率高的字段加上这个），不作为插入、更新、删除的依据字段。
  @Length(max = 50, message = "批次号的长度不能超过{max}")
  private String batchNumber;
  @JsonFormat(pattern = "yyyy-MM-dd")
  private java.sql.Date productionDate;
  @Length(max = 100, message = "生产厂家的长度不能超过{max}")
  private String manuFacturer;
  @NotNull(groups = AddWorkValidation.class,message="进货数量不能为空")
  @Range(min = 0,message = "进货数量的值必须大于等于{min}")
  private Long purchaseQuantity;//总数量
  @JsonProperty(access = JsonProperty.Access.READ_ONLY)
  private Long storedQuantity;//已入库数量。设计是在java代码中进行计算（因不是实时库存计算，因此不通过触发器来实现）。
  //在json转换的时候无法反向赋值
  @JsonProperty(access = JsonProperty.Access.READ_ONLY)
  private Long totalInventory;//总库存数(剩余库存数)，后续无法修改，由数据库通过物料批次实际入库存储详情来进行计算。
  private Long lockQuantity;//锁定数量（由业务决定），出库数量不能大于（库存数量-锁定数量）
  private Boolean isLock;//是否锁定商品库存，锁定后无法进行出入库
  @Length(max = 255, message = "备注的长度不能超过{max}")
  private String remark;
  //非数据库属性
  @JsonProperty(access = JsonProperty.Access.READ_ONLY)
  private Long pendingQuantity;//未入库数量，通过总数量-已入库数量计算出
  private Long seatNumber;//存储的库位数量

  public WmsMaterialBatch(String id) {
    this.id = id;
  }
}
